/**
 * 
 */
package br.com.sistransporte.transite.usuario.dao;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

import br.com.sistransporte.transitevo.usuario.model.UsuarioVO;
import br.com.src.masterpersistence.dao.GenericDAO;
import br.com.src.masterpersistence.exceptions.AlterarException;
import br.com.src.masterpersistence.exceptions.ExcluirException;
import br.com.src.masterpersistence.exceptions.FiltrarException;
import br.com.src.masterpersistence.exceptions.HibernatePersistenceException;
import br.com.src.masterpersistence.exceptions.InserirException;
import br.com.src.masterpersistence.utilidades.FabricaMensagensLog;
import br.com.src.masterpersistence.utilidades.Paginacao;
import br.com.src.utilidades.exceptions.DesconhecidoException;

/**
 * Classe que representa
 *
 *
 * @author Nelson Luis da Silva Junior <nelson.jr13@hotmail.com@>
 * @since 4 de Jul de 2013 15:18:07
 * @version 1.0
 */
public class UsuarioDAOImpl extends GenericDAO< UsuarioVO > implements UsuarioDAOService{

	public UsuarioDAOImpl( String typeSessionFactory ){
		super( typeSessionFactory );
		logger.info( FabricaMensagensLog.getMensagemLogConstrutor( "UsuarioDAOImpl" ) );
	}

	public ArrayList< UsuarioVO > filtrar( UsuarioVO vo, boolean isDisticnt, boolean isLike ) throws FiltrarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "UsuarioDAOImpl" ) );
		try {
			ArrayList< UsuarioVO > lista = filter( vo, isDisticnt, isLike );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "UsuarioDAOImpl" ) );
			return lista;
		} catch ( IllegalArgumentException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( IllegalAccessException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( InvocationTargetException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( Exception e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", new DesconhecidoException( e.getMessage(), e ) ) );
			throw new FiltrarException( e.getMessage(), e );
		}
	}
	
	public ArrayList< UsuarioVO > filtrarPaginacao( Paginacao< UsuarioVO > pagination, UsuarioVO vo, boolean isDisticnt, boolean isLike ) throws FiltrarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "UsuarioDAOImpl" ) );
		try {
			ArrayList< UsuarioVO > lista = paginacao( pagination, vo, isDisticnt, isLike );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "UsuarioDAOImpl" ) );
			return lista;
		} catch ( IllegalArgumentException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( IllegalAccessException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( InvocationTargetException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( Exception e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", new DesconhecidoException( e.getMessage(), e ) ) );
			throw new FiltrarException( e.getMessage(), e );
		}
	}
	
	
	public Integer getTotalCadastrados( UsuarioVO entidade, boolean isDisticnt, boolean isLike ) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		return super.getTotalCadastrados( entidade, isDisticnt, isLike );
	}

	
	public UsuarioVO inserir( UsuarioVO vo ) throws InserirException {
		try {
			logger.info( FabricaMensagensLog.getMensagemLogInicio( "UsuarioDAOImpl" ) );
			UsuarioVO objetoPersistido = (UsuarioVO) insert( vo );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "UsuarioDAOImpl" ) );
			return objetoPersistido;
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new InserirException( e.getMessage(), e );
		}
	}
	
	public void alterar( UsuarioVO vo ) throws AlterarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "UsuarioDAOImpl" ) );
		try {
			update( vo );
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new AlterarException( e.getMessage(), e );
		}
		logger.info( FabricaMensagensLog.getMensagemLogTermino( "UsuarioDAOImpl" ) );
	}

	
	public void excluir( UsuarioVO vo ) throws ExcluirException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "UsuarioDAOImpl" ) );
		try {
			delete( vo );
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "UsuarioDAOImpl", e ) );
			throw new ExcluirException( e.getMessage(), e );
		}
		logger.info( FabricaMensagensLog.getMensagemLogTermino( "UsuarioDAOImpl" ) );
	}
}
